import { AuthToken, UserInfo, saveAuthData } from '../auth/authService';

// 登录请求参数
export interface LoginParams {
  username: string;
  password: string;
}

// 注册请求参数
export interface RegisterParams {
  username: string;
  email: string;
  password: string;
}

// 认证API
export const authApi = {
  /**
   * 用户登录
   */
  login: async (params: LoginParams): Promise<any> => {
    try {
      // 直接使用fetch API调用相对路径的API代理，完全避免跨域问题
      const fetchResponse = await fetch('/api/login', {  
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(params),
      });
      
      // 检查响应状态
      if (!fetchResponse.ok) {
        throw new Error(`登录失败: ${fetchResponse.status}`);
      }
      
      const response = await fetchResponse.json();
      
      // 处理新的响应格式 (code, msg, data)
      if (response.data && response.data.access_token) {
        const { access_token, user } = response.data;
        
        // 构造token对象
        const tokenData = {
          access_token: access_token,
          refresh_token: '', // 响应中没有提供refresh_token
          expires_in: 3600 // 设置默认过期时间为1小时
        };
        
        // 保存认证信息
        saveAuthData(tokenData, user || { id: '', username: params.username, email: '' });
      }
      
      return response;
    } catch (error) {
      console.error('登录失败:', error);
      // 抛出带有明确错误信息的异常
      if (error.response?.data?.message) {
        throw new Error(error.response.data.message);
      } else if (error.message) {
        throw new Error(error.message);
      }
      throw new Error('登录失败，请检查网络连接或稍后再试');
    }
  },

  /**
   * 用户注册
   */
  register: async (params: RegisterParams): Promise<any> => {
    try {
      // 直接使用fetch API调用相对路径的API代理
      const fetchResponse = await fetch('/api/register', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(params),
      });
      
      if (!fetchResponse.ok) {
        throw new Error(`注册失败: ${fetchResponse.status}`);
      }
      
      const response = await fetchResponse.json();
      
      // 处理新的响应格式 (code, msg, data)
      if (response.data && response.data.access_token) {
        const { access_token, user } = response.data;
        
        // 构造token对象
        const tokenData = {
          access_token: access_token,
          refresh_token: '', // 响应中没有提供refresh_token
          expires_in: 3600 // 设置默认过期时间为1小时
        };
        
        // 保存认证信息
        saveAuthData(tokenData, user || { id: '', username: params.username, email: params.email });
      }
      
      return response;
    } catch (error) {
      console.error('注册失败:', error);
      // 抛出带有明确错误信息的异常
      if (error.response?.data?.message) {
        throw new Error(error.response.data.message);
      } else if (error.message) {
        throw new Error(error.message);
      }
      throw new Error('注册失败，请检查网络连接或稍后再试');
    }
  },

  /**
   * 刷新Token
   */
  refreshToken: async (refreshToken: string): Promise<any> => {
    try {
      // 直接使用fetch API调用相对路径的API代理
      const fetchResponse = await fetch('/api/refresh-token', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ refresh_token: refreshToken }),
      });
      
      if (!fetchResponse.ok) {
        throw new Error(`刷新Token失败: ${fetchResponse.status}`);
      }
      
      const response = await fetchResponse.json();
      
      // 处理新的响应格式 (code, msg, data)
      if (response.data && response.data.access_token) {
        const { access_token } = response.data;
        
        // 构造token对象
        const tokenData = {
          access_token: access_token,
          refresh_token: refreshToken,
          expires_in: 3600 // 设置默认过期时间为1小时
        };
        
        // 只更新token，不更新用户信息
        const currentUser = localStorage.getItem('user_info');
        if (currentUser) {
          saveAuthData(tokenData, JSON.parse(currentUser));
        }
      }
      
      return response;
    } catch (error) {
      console.error('刷新Token失败:', error);
      throw error;
    }
  },

  /**
   * 用户登出
   */
  logout: async (): Promise<void> => {
    try {
      // 直接使用fetch API调用相对路径的API代理
      await fetch('/api/logout', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
      });
    } catch (error) {
      console.error('登出失败:', error);
      // 即使登出API失败，仍然清除本地认证信息
    } finally {
      // 无论如何都清除本地存储的认证信息
      localStorage.removeItem('token');
      localStorage.removeItem('user');
    }
  },

  /**
   * 获取当前用户信息
   */
  getCurrentUser: async (): Promise<UserInfo> => {
    try {
      // 直接使用fetch API调用相对路径的API代理
      const fetchResponse = await fetch('/api/auth/me', {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${localStorage.getItem('auth_token')}`
        },
      });
      
      if (!fetchResponse.ok) {
        throw new Error(`获取用户信息失败: ${fetchResponse.status}`);
      }
      
      const response = await fetchResponse.json();
      
      // 处理新的响应格式
      if (response.data && response.data.user) {
        return response.data.user;
      } else if (response.user) {
        return response.user;
      }
      
      return response;
    } catch (error) {
      console.error('获取用户信息失败:', error);
      throw error;
    }
  },
};

export default authApi;